﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Jardin_Informativo_Agua_Tierra
{
    public partial class RegistroDocumentos : Form
    {
        public RegistroDocumentos()
        {
            InitializeComponent();
        }
        JardinInformativoBDEntities BEDE = new JardinInformativoBDEntities();
        IEnumerable<Boleta> ListaBoletas;
        IEnumerable<Contratos> ListaContratos;
        Validacion v = new Validacion();
        Generador g = new Generador();

        int valfolioboleta;
        int valfechaboleta;
        int valmontoboleta;
        int valconceptoboleta;
        int valpagador;
        int valdescripcion;

        int valfoliocontrato;
        int valfechacontrato;
        int valapoderado;
        int valobservacioncontrato;

        
        private void LlenarBoletas()
        {
            dgv_Boletas.Rows.Clear();
            ListaBoletas = BEDE.Boleta.OrderBy(c => c.fecha);
            foreach (Boleta aux in ListaBoletas)
            {
                dgv_Boletas.Rows.Add(aux.folio.ToString(), aux.fecha.ToShortDateString(), aux.Responsable_Pago.nombre.Replace("·"," ").ToString(), aux.monto.ToString());
            }
        }

        private void LimpiarBoleta()
        {
            tbx_FolioDocumento.Clear();
            tbx_Descripcion.Clear();
            cbx_Pagador.SelectedIndex = -1;
            cbx_PorConceptoDe.SelectedIndex = -1;
            dtp_FechaEmision.Value = DateTime.Now.Date;
            tbx_Monto.Clear();
            errorProvider1.Clear();
        }

        private void LlenarContratos()
        {
            dgv_Contratos.Rows.Clear();
            ListaContratos = BEDE.Contratos.OrderBy(c => c.fecha);
            foreach (Contratos aux in ListaContratos)
            {
                dgv_Contratos.Rows.Add(aux.folio.ToString(), aux.Apoderado.nombre.Replace("·", " ").ToString(), aux.fecha.ToShortDateString());
            }
        }

        private void LimpiarContrato()
        {
            tbx_ComentariosContrato.Clear();
            tbx_FolioContrato.Clear();
            dtp_FechaContrato.Value = DateTime.Now.Date;
            cbx_Apoderado.SelectedIndex = -1;
            errorProvider1.Clear();
        }

        private void RegistroDocumentos_Load(object sender, EventArgs e)
        {
            LlenarBoletas();
            LlenarContratos();
            rad_RegistrarBoleta.Checked = true;
            cbx_Pagador.DataSource = BEDE.Responsable_Pago.OrderBy(c => c.id_responsable);
            cbx_Pagador.DisplayMember = "nombre";
            cbx_Pagador.ValueMember = "id_responsable";
            cbx_Pagador.SelectedIndex = -1;
            cbx_Apoderado.DataSource = BEDE.Apoderado.OrderBy(c => c.rut_apoderado);
            cbx_Apoderado.DisplayMember = "nombre";
            cbx_Apoderado.ValueMember = "rut_apoderado";
            cbx_Apoderado.SelectedIndex = -1;
        }

        private void tbx_FolioDocumento_Leave(object sender, EventArgs e)
        {
            tbx_FolioDocumento.Text = tbx_FolioDocumento.Text.Trim();
            valfolioboleta = v.ValidarNumeros(tbx_FolioDocumento.Text);
            if (valfolioboleta == 0) { errorProvider1.SetError(lbl_FolioDocumento, "Este campo solo puede contener numeros enteros y positivos.\nEste campo no puede quedar vacío."); }
            else { errorProvider1.SetError(lbl_FolioDocumento, ""); }
        }

        private void dtp_FechaEmision_Leave(object sender, EventArgs e)
        {
            if (dtp_FechaEmision.Value.Date > DateTime.Now.Date) { valfechaboleta = 0; } else { valfechaboleta = 1; }
            if (valfechaboleta == 0) { errorProvider1.SetError(lbl_FechaEmision, "La fecha de emisión del documento no puede ser superior a la fecha actual."); }
            else { errorProvider1.SetError(lbl_FechaEmision, ""); }
        }

        private void tbx_Monto_Leave(object sender, EventArgs e)
        {
            tbx_Monto.Text = tbx_Monto.Text.Trim();
            valmontoboleta = v.ValidarNumeros(tbx_Monto.Text);
            if (valmontoboleta == 0) { errorProvider1.SetError(lbl_Monto, "Este campo solo puede contener numeros enteros y positivos.\nEste campo no puede quedar vacío."); }
            else { errorProvider1.SetError(lbl_Monto, ""); }
        }

        private void cbx_PorConceptoDe_Leave(object sender, EventArgs e)
        {
            valconceptoboleta = v.ValidarCombobox(cbx_PorConceptoDe.Text);
            if (valconceptoboleta == 0) { errorProvider1.SetError(lbl_PorConceptoDe, "Debe seleccionar una opcion para este campo."); }
            else { errorProvider1.SetError(lbl_PorConceptoDe, ""); }
        }

        private void cbx_Pagador_Leave(object sender, EventArgs e)
        {
            valpagador = v.ValidarCombobox(cbx_Pagador.Text);
            if (valpagador == 0) { errorProvider1.SetError(lbl_Pagador, "Este campo no puede quedar vacío."); }
            else
            {
                try
                {
                    string nombre = ((Responsable_Pago)cbx_Pagador.SelectedItem).nombre.Replace("·", " ");
                    valpagador = 1;
                    errorProvider1.SetError(lbl_Pagador, "");
                }
                catch { errorProvider1.SetError(lbl_Pagador, "La persona que intenta asociar al documento no se encuentra registrada como responsable de pagos."); valpagador = 0; }
            }
        }

        private void tbx_Descripcion_Leave(object sender, EventArgs e)
        {
            tbx_Descripcion.Text = tbx_Descripcion.Text.Trim();
            if (tbx_Descripcion.Text == "") { tbx_Descripcion.Text = "SIN OBSERVACIONES."; }
            valdescripcion = v.ValidarDescripciones(tbx_Descripcion.Text);
            if (valdescripcion == 0) { errorProvider1.SetError(lbl_Descripcion, "La descripción ingresada es incorrecta. (Puede ser error de sintaxis o consistencia de la información."); }
            else { errorProvider1.SetError(lbl_Descripcion, ""); }
        }

        private void btn_GuardarBoleta_Click(object sender, EventArgs e)
        {
            tbx_FolioDocumento.Focus();
            dtp_FechaEmision.Focus();
            tbx_Monto.Focus();
            cbx_PorConceptoDe.Focus();
            cbx_Pagador.Focus();
            tbx_Descripcion.Focus();
            btn_GuardarBoleta.Focus();

            int continuar = valfolioboleta * valfechaboleta * valmontoboleta * valconceptoboleta * valpagador * valdescripcion;
            if (continuar == 0) { MessageBox.Show("No se puede registrar el documento, pues existen errores en los datos ingresados.\nRevise y corrija los campos señalados, y reintente guardar el registro.", "ERROR DE DATOS.", MessageBoxButtons.OK, MessageBoxIcon.Error); }
            else
            {
                try
                {
                    Boleta aux = BEDE.Boleta.Single(c => c.folio == int.Parse(tbx_FolioDocumento.Text));
                    MessageBox.Show("No se ha podido registrar el documento descrito, pues ya existe otro documento registrado con el mismo folio.", "ERROR DE CONSISTENCIA.", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                catch
                {
                    Boleta aux = new Boleta();
                    aux.folio = int.Parse(tbx_FolioDocumento.Text);
                    aux.descripcion = tbx_Descripcion.Text;
                    aux.monto = float.Parse(tbx_Monto.Text);
                    aux.fecha = dtp_FechaEmision.Value.Date;
                    aux.por_concepto = cbx_PorConceptoDe.Text;
                    aux.id_responsable = ((Responsable_Pago)cbx_Pagador.SelectedItem).id_responsable;
                    BEDE.Boleta.AddObject(aux);
                    BEDE.SaveChanges();
                    LlenarBoletas();
                    LimpiarBoleta();
                    MessageBox.Show("El documento descrito fue correctamente regitrado.", "DOCUMENTO REGISTRADO.", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
        }

        private void btn_Limpiar_Click(object sender, EventArgs e)
        {
            LimpiarBoleta();
        }

        private void rad_RegistrarBoleta_CheckedChanged(object sender, EventArgs e)
        {
            if (rad_RegistrarBoleta.Checked == true) { pnl_Boleta.Enabled = true; pnl_Contratos.Enabled = false; }
            LimpiarBoleta(); LimpiarContrato();
        }

        private void rad_RegistrarContrato_CheckedChanged(object sender, EventArgs e)
        {
            if (rad_RegistrarContrato.Checked == true) { pnl_Boleta.Enabled = false; pnl_Contratos.Enabled = true; }
        }

        private void btn_LimpiarContrato_Click(object sender, EventArgs e)
        {
            LimpiarContrato();
        }

        private void tbx_FolioContrato_Leave(object sender, EventArgs e)
        {
            tbx_FolioContrato.Text = tbx_FolioContrato.Text.Trim();
            valfoliocontrato = v.ValidarNumeros(tbx_FolioContrato.Text);
            if (valfoliocontrato == 0) { errorProvider1.SetError(lbl_FolioContrato, "Este campo solo admite numeros enteros y positivos.\nEste campo no puede quedar vacío."); }
        }

        private void dtp_FechaContrato_Leave(object sender, EventArgs e)
        {
            if (dtp_FechaContrato.Value.Date > DateTime.Now.Date) { valfechacontrato = 0; } else { valfechacontrato = 1; }
            if (valfechacontrato == 0) { errorProvider1.SetError(lbl_FechaContrato, "No se puede registrar un contrato que aun no se ha firmado."); }
            else { errorProvider1.SetError(lbl_FechaContrato, ""); }
        }

        private void cbx_Apoderado_Leave(object sender, EventArgs e)
        {
            cbx_Apoderado.Text = cbx_Apoderado.Text.Trim();
            valapoderado = v.ValidarCombobox(cbx_Apoderado.Text);
            if (valapoderado == 0) { errorProvider1.SetError(lbl_Apoderado, "Debe ingresar a un apoderado responsable del contrato."); }
            else
            {
                try
                {
                    string nombre = ((Apoderado)cbx_Apoderado.SelectedItem).nombre.Replace("·", " ");
                    errorProvider1.SetError(lbl_Apoderado, "");
                    valapoderado = 1;
                }
                catch { errorProvider1.SetError(lbl_Apoderado, "El apoderado que intenta registrar como contraparte del contrato,\nno es un apoderado oficial de ningun niño del jardin."); valapoderado = 0; }
            }
        }

        private void cbx_Pagador_SelectedIndexChanged(object sender, EventArgs e)
        {
            errorProvider1.SetError(lbl_Pagador, "");
        }

        private void cbx_Apoderado_SelectedIndexChanged(object sender, EventArgs e)
        {
            errorProvider1.SetError(lbl_Apoderado, "");
        }

        private void btn_RegistrarContrato_Click(object sender, EventArgs e)
        {
            tbx_FolioContrato.Focus();
            dtp_FechaContrato.Focus();
            cbx_Apoderado.Focus();
            tbx_ComentariosContrato.Focus();
            btn_RegistrarContrato.Focus();
            int seguir = valfoliocontrato * valfechacontrato * valapoderado * valobservacioncontrato;
            if (seguir == 0) { MessageBox.Show("No se pudo registrar el contrato descrito, pues existen errores en los datos ingresados. Por favor revise y corrija los datos señalados, y reintente registrar el documento.", "ERROR DE DATOS.", MessageBoxButtons.OK, MessageBoxIcon.Error); MessageBox.Show("valfoliocontrato = " + valfoliocontrato.ToString() + "\nValfechacontrato = " + valfechacontrato.ToString() + "\nValapoderado = " + valapoderado.ToString() + "\nValDescripcion = " + valobservacioncontrato.ToString(), "error.", MessageBoxButtons.OK, MessageBoxIcon.Information); }
            else
            {
                try
                {
                    Contratos aux = BEDE.Contratos.Single(c=>c.folio == int.Parse(tbx_FolioContrato.Text));
                    MessageBox.Show("No se pudo registrar el contrato descrito, pues ya se encuentra registrado. Revise el indice de contratos.", "ERROR DE CONSISTENCIA.", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                catch
                {
                    Contratos aux =  new Contratos();
                    aux.folio = int.Parse(tbx_FolioContrato.Text);
                    aux.fecha = dtp_FechaContrato.Value.Date;
                    aux.observacion = tbx_ComentariosContrato.Text;
                    aux.rut_apoderado = ((Apoderado)cbx_Apoderado.SelectedItem).rut_apoderado;
                    BEDE.Contratos.AddObject(aux);
                    BEDE.SaveChanges();
                    LlenarContratos();
                    LimpiarContrato();
                    MessageBox.Show("El contrato descrito fue correctamente registrado.", "DOCUMENTO REGISTRADO.", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
        }

        private void tbx_ComentariosContrato_Leave(object sender, EventArgs e)
        {
            tbx_ComentariosContrato.Text = tbx_ComentariosContrato.Text.Trim();
            if (tbx_ComentariosContrato.Text == "") { tbx_ComentariosContrato.Text = "SIN OBSERVACIONES."; }
            valobservacioncontrato = v.ValidarDescripciones(tbx_ComentariosContrato.Text);
            if (valobservacioncontrato == 0) { errorProvider1.SetError(lbl_ComentariosContrato, "La descripción ingresada es incorrecta. (Puede ser error de sintaxis o consistencia de la información."); }
            else { errorProvider1.SetError(lbl_ComentariosContrato, ""); }
        }
    }
}
